home *** CD-ROM | disk | FTP | other *** search
/ Internet Surfer 2.0 / Internet Surfer 2.0 (Wayzata Technology) (1996).iso / pc / text / mac / faqs.223 < prev    next >
Text File  |  1996-02-12  |  25KB  |  667 lines

  1. Frequently Asked Questions (FAQS);faqs.223
  2.  
  3.  
  4.  
  5. A:    In general, you cannot.  You must provide a version of that
  6.     other function which accepts a va_list pointer, as does vfprintf
  7.     in the example above.  If the arguments must be passed directly
  8.     as actual arguments (not indirectly through a va_list pointer)
  9.     to another function which is itself variadic (for which you do
  10.     not have the option of creating an alternate, va_list-accepting
  11.     version) no portable solution is possible.  (The problem can be
  12.     solved by resorting to machine-specific assembly language.)
  13.  
  14. 7.5:    How can I call a function with an argument list built up at run
  15.     time?
  16.  
  17. A:    There is no guaranteed or portable way to do this.  If you're
  18.     curious, ask this list's editor, who has a few wacky ideas you
  19.     could try...  (See also question 16.10.)
  20.  
  21.  
  22. Section 8. Boolean Expressions and Variables
  23.  
  24. 8.1:    What is the right type to use for boolean values in C?  Why
  25.     isn't it a standard type?  Should #defines or enums be used for
  26.     the true and false values?
  27.  
  28. A:    C does not provide a standard boolean type, because picking one
  29.     involves a space/time tradeoff which is best decided by the
  30.     programmer.  (Using an int for a boolean may be faster, while
  31.     using char may save data space.)
  32.  
  33.     The choice between #defines and enums is arbitrary and not
  34.     terribly interesting (see also question 9.1).  Use any of
  35.  
  36.         #define TRUE  1            #define YES 1
  37.         #define FALSE 0            #define NO  0
  38.  
  39.         enum bool {false, true};    enum bool {no, yes};
  40.  
  41.     or use raw 1 and 0, as long as you are consistent within one
  42.     program or project.  (An enum may be preferable if your debugger
  43.     expands enum values when examining variables.)
  44.  
  45.     Some people prefer variants like
  46.  
  47.         #define TRUE (1==1)
  48.         #define FALSE (!TRUE)
  49.  
  50.     or define "helper" macros such as
  51.  
  52.         #define Istrue(e) ((e) != 0)
  53.  
  54.     These don't buy anything (see question 8.2 below; see also
  55.     question 1.6).
  56.  
  57. 8.2:    Isn't #defining TRUE to be 1 dangerous, since any nonzero value
  58.     is considered "true" in C?  What if a built-in boolean or
  59.     relational operator "returns" something other than 1?
  60.  
  61. A:    It is true (sic) that any nonzero value is considered true in C,
  62.     but this applies only "on input", i.e. where a boolean value is
  63.     expected.  When a boolean value is generated by a built-in
  64.     operator, it is guaranteed to be 1 or 0.  Therefore, the test
  65.  
  66.         if((a == b) == TRUE)
  67.  
  68.     will work as expected (as long as TRUE is 1), but it is
  69.     obviously silly.  In general, explicit tests against TRUE and
  70.     FALSE are undesirable, because some library functions (notably
  71.     isupper, isalpha, etc.) return, on success, a nonzero value
  72.     which is _not_ necessarily 1.  (Besides, if you believe that
  73.     "if((a == b) == TRUE)" is an improvement over "if(a == b)", why
  74.     stop there?  Why not use "if(((a == b) == TRUE) == TRUE)"?)  A
  75.     good rule of thumb is to use TRUE and FALSE (or the like) only
  76.     for assignment to a Boolean variable, or as the return value
  77.     from a Boolean function, never in a comparison.
  78.  
  79.     The preprocessor macros TRUE and FALSE (and, of course, NULL)
  80.     are used for code readability, not because the underlying values
  81.     might ever change.  (See also question 1.7.)
  82.  
  83.     References: K&R I Sec. 2.7 p. 41; K&R II Sec. 2.6 p. 42,
  84.     Sec. A7.4.7 p. 204, Sec. A7.9 p. 206; ANSI Secs. 3.3.3.3, 3.3.8,
  85.     3.3.9, 3.3.13, 3.3.14, 3.3.15, 3.6.4.1, 3.6.5; Achilles and the
  86.     Tortoise.
  87.  
  88.  
  89. Section 9. Structs, Enums, and Unions
  90.  
  91. 9.1:    What is the difference between an enum and a series of
  92.     preprocessor #defines?
  93.  
  94. A:    At the present time, there is little difference.  Although many
  95.     people might have wished otherwise, the ANSI standard says that
  96.     enumerations may be freely intermixed with integral types,
  97.     without errors.  (If such intermixing were disallowed without
  98.     explicit casts, judicious use of enums could catch certain
  99.     programming errors.)
  100.  
  101.     The primary advantages of enums are that the numeric values are
  102.     automatically assigned, and that a debugger may be able to
  103.     display the symbolic values when enum variables are examined.
  104.     (A compiler may also generate nonfatal warnings when enums and
  105.     ints are indiscriminately mixed, since doing so can still be
  106.     considered bad style even though it is not strictly illegal).  A
  107.     disadvantage is that the programmer has little control over the
  108.     size (or over those nonfatal warnings).
  109.  
  110.     References: K&R II Sec. 2.3 p. 39, Sec. A4.2 p. 196; H&S
  111.     Sec. 5.5 p. 100; ANSI Secs. 3.1.2.5, 3.5.2, 3.5.2.2 .
  112.  
  113. 9.2:    I heard that structures could be assigned to variables and
  114.     passed to and from functions, but K&R I says not.
  115.  
  116. A:    What K&R I said was that the restrictions on struct operations
  117.     would be lifted in a forthcoming version of the compiler, and in
  118.     fact struct assignment and passing were fully functional in
  119.     Ritchie's compiler even as K&R I was being published.  Although
  120.     a few early C compilers lacked struct assignment, all modern
  121.     compilers support it, and it is part of the ANSI C standard, so
  122.     there should be no reluctance to use it.
  123.  
  124.     References: K&R I Sec. 6.2 p. 121; K&R II Sec. 6.2 p. 129; H&S
  125.     Sec. 5.6.2 p. 103; ANSI Secs. 3.1.2.5, 3.2.2.1, 3.3.16 .
  126.  
  127. 9.3:    How does struct passing and returning work?
  128.  
  129. A:    When structures are passed as arguments to functions, the entire
  130.     struct is typically pushed on the stack, using as many words as
  131.     are required.  (Programmers often choose to use pointers to
  132.     structures instead, precisely to avoid this overhead.)
  133.  
  134.     Structures are often returned from functions in a location
  135.     pointed to by an extra, compiler-supplied "hidden" argument to
  136.     the function.  Some older compilers used a special, static
  137.     location for structure returns, although this made struct-valued
  138.     functions nonreentrant, which ANSI C disallows.
  139.  
  140.     Reference: ANSI Sec. 2.2.3 p. 13.
  141.  
  142. 9.4:    The following program works correctly, but it dumps core after
  143.     it finishes.  Why?
  144.  
  145.         struct list
  146.             {
  147.             char *item;
  148.             struct list *next;
  149.             }
  150.  
  151.         /* Here is the main program. */
  152.  
  153.         main(argc, argv)
  154.         ...
  155.  
  156. A:    A missing semicolon causes the compiler to believe that main
  157.     returns a structure.  (The connection is hard to see because of
  158.     the intervening comment.)  Since struct-valued functions are
  159.     usually implemented by adding a hidden return pointer, the
  160.     generated code for main() tries to accept three arguments,
  161.     although only two are passed (in this case, by the C start-up
  162.     code).  See also question 17.15.
  163.  
  164.     Reference: CT&P Sec. 2.3 pp. 21-2.
  165.  
  166. 9.5:    Why can't you compare structs?
  167.  
  168. A:    There is no reasonable way for a compiler to implement struct
  169.     comparison which is consistent with C's low-level flavor.  A
  170.     byte-by-byte comparison could be invalidated by random bits
  171.     present in unused "holes" in the structure (such padding is used
  172.     to keep the alignment of later fields correct).  A field-by-
  173.     field comparison would require unacceptable amounts of
  174.     repetitive, in-line code for large structures.
  175.  
  176.     If you want to compare two structures, you must write your own
  177.     function to do so.  C++ would let you arrange for the ==
  178.     operator to map to your function.
  179.  
  180.     References: K&R II Sec. 6.2 p. 129; H&S Sec. 5.6.2 p. 103; ANSI
  181.     Rationale Sec. 3.3.9 p. 47.
  182.  
  183. 9.6:    I came across some code that declared a structure like this:
  184.  
  185.         struct name
  186.             {
  187.             int namelen;
  188.             char name[1];
  189.             };
  190.  
  191.     and then did some tricky allocation to make the name array act
  192.     like it had several elements.  Is this legal and/or portable?
  193.  
  194. A:    This technique is popular, although Dennis Ritchie has called it
  195.     "unwarranted chumminess with the compiler."  The ANSI C standard
  196.     allows it only implicitly.  It seems to be portable to all known
  197.     implementations.  (Compilers which check array bounds carefully
  198.     might issue warnings.)
  199.  
  200.     References: ANSI Rationale Sec. 3.5.4.2 pp. 54-5.
  201.  
  202. 9.7:    How can I determine the byte offset of a field within a
  203.     structure?
  204.  
  205. A:    ANSI C defines the offsetof macro, which should be used if
  206.     available; see <stddef.h>.  If you don't have it, a suggested
  207.     implementation is
  208.  
  209.         #define offsetof(type, mem) ((size_t) \
  210.             ((char *)&((type *) 0)->mem - (char *)((type *) 0)))
  211.  
  212.     This implementation is not 100% portable; some compilers may
  213.     legitimately refuse to accept it.
  214.  
  215.     See the next question for a usage hint.
  216.  
  217.     References: ANSI Sec. 4.1.5 , Rationale Sec. 3.5.4.2 p. 55.
  218.  
  219. 9.8:    How can I access structure fields by name at run time?
  220.  
  221. A:    Build a table of names and offsets, using the offsetof() macro.
  222.     The offset of field b in struct a is
  223.  
  224.         offsetb = offsetof(struct a, b)
  225.  
  226.     If structp is a pointer to an instance of this structure, and b
  227.     is an int field with offset as computed above, b's value can be
  228.     set indirectly with
  229.  
  230.         *(int *)((char *)structp + offsetb) = value;
  231.  
  232. 9.9:    Why does sizeof report a larger size than I expect for a
  233.     structure type, as if there was padding at the end?
  234.  
  235. A:    Structures may have this padding (as well as internal padding;
  236.     see also question 9.5), so that alignment properties will be
  237.     preserved when an array of contiguous structures is allocated.
  238.  
  239. 9.10:    My compiler is leaving holes in structures, which is wasting
  240.     space and preventing "binary" I/O to external data files.  Can I
  241.     turn off the padding, or otherwise control the alignment of
  242.     structs?
  243.  
  244. A:    Your compiler may provide an extension to give you this control
  245.     (perhaps a #pragma), but there is no standard method.  See also
  246.     question 17.2.
  247.  
  248. 9.11:    Can I initialize unions?
  249.  
  250. A:    ANSI Standard C allows an initializer for the first member of a
  251.     union.  There is no standard way of initializing the other
  252.     members (nor, under a pre-ANSI compiler, is there generally any
  253.     way of initializing any of them).
  254.  
  255.  
  256. Section 10. Declarations
  257.  
  258. 10.1:    How do you decide which integer type to use?
  259.  
  260. A:    If you might need large values (above 32767 or below -32767),
  261.     use long.  Otherwise, if space is very important (there are
  262.     large arrays or many structures), use short.  Otherwise, use
  263.     int.  If well-defined overflow characteristics are important
  264.     and/or negative values are not, use the corresponding unsigned
  265.     types.  (But beware of mixing signed and unsigned in
  266.     expressions.)  Similar arguments apply when deciding between
  267.     float and double.
  268.  
  269.     Although char or unsigned char can be used as a "tiny" int type,
  270.     doing so is often more trouble than it's worth, due to
  271.     unpredictable sign extension and increased code size.
  272.  
  273.     These rules obviously don't apply if the address of a variable
  274.     is taken and must have a particular type.
  275.  
  276.     If for some reason you need to declare something with an _exact_
  277.     size (usually the only good reason for doing so is when
  278.     attempting to conform to some externally-imposed storage layout,
  279.     but see question 17.2), be sure to encapsulate the choice behind
  280.     an appropriate typedef.
  281.  
  282. 10.2:    I can't seem to define a linked list successfully.  I tried
  283.  
  284.         typedef struct
  285.             {
  286.             char *item;
  287.             NODEPTR next;
  288.             } *NODEPTR;
  289.  
  290.     but the compiler gave me error messages.  Can't a struct in C
  291.     contain a pointer to itself?
  292.  
  293. A:    Structs in C can certainly contain pointers to themselves; the
  294.     discussion and example in section 6.5 of K&R make this clear.
  295.     The problem with this example is that the NODEPTR typedef is not
  296.     complete at the point where the "next" field is declared.  To
  297.     fix it, first give the structure a tag ("struct node").  Then,
  298.     declare the "next" field as "struct node *next;", and/or move
  299.     the typedef declaration wholly before or wholly after the struct
  300.     declaration.  One fixed version would be
  301.  
  302.         struct node
  303.             {
  304.             char *item;
  305.             struct node *next;
  306.             };
  307.  
  308.         typedef struct node *NODEPTR;
  309.  
  310.     , and there are at least three other equivalently correct ways
  311.     of arranging it.
  312.  
  313.     A similar problem, with a similar solution, can arise when
  314.     attempting to declare a pair of typedef'ed mutually recursive
  315.     structures.
  316.  
  317.     References: K&R I Sec. 6.5 p. 101; K&R II Sec. 6.5 p. 139; H&S
  318.     Sec. 5.6.1 p. 102; ANSI Sec. 3.5.2.3 .
  319.  
  320. 10.3:    How do I declare an array of pointers to functions returning
  321.     pointers to functions returning pointers to characters?
  322.  
  323. A:    This question can be answered in at least three ways (all
  324.     declare the hypothetical array with 5 elements):
  325.  
  326.     1.  char *(*(*a[5])())();
  327.  
  328.     2.  Build the declaration up in stages, using typedefs:
  329.  
  330.         typedef char *pc;    /* pointer to char */
  331.         typedef pc fpc();    /* function returning pointer to char */
  332.         typedef fpc *pfpc;    /* pointer to above */
  333.         typedef pfpc fpfpc();    /* function returning... */
  334.         typedef fpfpc *pfpfpc;    /* pointer to... */
  335.         pfpfpc a[5];        /* array of... */
  336.  
  337.     3.  Use the cdecl program, which turns English into C and vice
  338.         versa:
  339.  
  340.         cdecl> declare a as array 5 of pointer to function returning
  341.              pointer to function returning pointer to char
  342.         char *(*(*a[5])())()
  343.  
  344.         cdecl can also explain complicated declarations, help with
  345.         casts, and indicate which set of parentheses the arguments
  346.         go in (for complicated function definitions, like the
  347.         above).  Versions of cdecl are in volume 14 of
  348.         comp.sources.unix (see question 17.8) and K&R II.
  349.  
  350.     Any good book on C should explain how to read these complicated
  351.     C declarations "inside out" to understand them ("declaration
  352.     mimics use").
  353.  
  354.     References: K&R II Sec. 5.12 p. 122; H&S Sec. 5.10.1 p. 116.
  355.  
  356. 10.4:    I'm building a state machine with a bunch of functions, one for
  357.     each state.  I want to implement state transitions by having
  358.     each function return a pointer to the next state function.  I
  359.     find a limitation in C's declaration mechanism: there's no way
  360.     to declare these functions as returning a pointer to a function
  361.     returning a pointer to a function returning a pointer to a
  362.     function...
  363.  
  364. A:    You can't do it directly.  Either have the function return a
  365.     generic function pointer type, and apply a cast before calling
  366.     through it; or have it return a structure containing only a
  367.     pointer to a function returning that structure.
  368.  
  369. 10.5:    What's the best way to declare and define global variables?
  370.  
  371. A:    First, though there can be many _declarations_ (and in many
  372.     translation units) of a single "global" (strictly speaking,
  373.     "external") variable (or function), there must be exactly one
  374.     _definition_.  (The definition is the declaration that actually
  375.     allocates space, and provides an initialization value, if any.)
  376.     It is best to place the definition in some central (to the
  377.     program, or to the module) .c file, with an external declaration
  378.     in a header (".h") file, which is #included wherever the
  379.     declaration is needed.  The .c file containing the definition
  380.     should also #include the header file containing the external
  381.     declaration, so that the compiler can check that the
  382.     declarations match.
  383.  
  384.     This rule promotes a high degree of portability, and is
  385.     consistent with the requirements of the ANSI C Standard.  Note
  386.     that Unix compilers and linkers typically use a "common model"
  387.     which allows multiple (uninitialized) definitions.  A few very
  388.     odd systems may require an explicit initializer to distinguish a
  389.     definition from an external declaration.
  390.  
  391.     It is possible to use preprocessor tricks to arrange that the
  392.     declaration need only be typed once, in the header file, and
  393.     "turned into" a definition, during exactly one #inclusion, via a
  394.     special #define.
  395.  
  396.     References: K&R I Sec. 4.5 pp. 76-7; K&R II Sec. 4.4 pp. 80-1;
  397.     ANSI Sec. 3.1.2.2 (esp. Rationale), Secs. 3.7, 3.7.2,
  398.     Sec. F.5.11 .
  399.  
  400. 10.6:    I finally figured out the syntax for declaring pointers to
  401.     functions, but now how do I initialize one?
  402.  
  403. A:    Use something like
  404.  
  405.         extern int func();
  406.         int (*fp)() = func;
  407.  
  408.     When the name of a function appears in an expression but is not
  409.     being called (i.e. is not followed by a "("), it "decays" into a
  410.     pointer (i.e. it has its address implicitly taken), much as an
  411.     array name does.
  412.  
  413.     An explicit extern declaration for the function is normally
  414.     needed, since implicit external function declaration does not
  415.     happen in this case (again, because the function name is not
  416.     followed by a "(").
  417.  
  418. 10.7:    I've seen different methods used for calling through pointers to
  419.     functions.  What's the story?
  420.  
  421. A:    Originally, a pointer to a function had to be "turned into" a
  422.     "real" function, with the * operator (and an extra pair of
  423.     parentheses, to keep the precedence straight), before calling:
  424.  
  425.         int r, func(), (*fp)() = func;
  426.         r = (*fp)();
  427.  
  428.     It can also be argued that functions are always called through
  429.     pointers, but that "real" functions decay implicitly into
  430.     pointers (in expressions, as they do in initializations) and so
  431.     cause no trouble.  This reasoning, made widespread through pcc
  432.     and adopted in the ANSI standard, means that
  433.  
  434.         r = fp();
  435.  
  436.     is legal and works correctly, whether fp is a function or a
  437.     pointer to one.  (The usage has always been unambiguous; there
  438.     is nothing you ever could have done with a function pointer
  439.     followed by an argument list except call through it.)  An
  440.     explicit * is harmless, and still allowed (and recommended, if
  441.     portability to older compilers is important).
  442.  
  443.     References: ANSI Sec. 3.3.2.2 p. 41, Rationale p. 41.
  444.  
  445.  
  446. Section 11. Stdio
  447.  
  448. 11.1:    Why doesn't this code:
  449.  
  450.         char c;
  451.         while((c = getchar()) != EOF)...
  452.  
  453.     work?
  454.  
  455. A:    For one thing, the variable to hold getchar's return value must
  456.     be an int.  getchar can return all possible character values, as
  457.     well as EOF.  By passing getchar's return value through a char,
  458.     either a normal character might be misinterpreted as EOF, or the
  459.     EOF might be altered and so never seen.
  460.  
  461.     References: CT&P Sec. 5.1 p. 70.
  462.  
  463. 11.2:    Why does errno contain ENOTTY after a call to printf?
  464.  
  465. A:    Many implementations of the stdio package adjust their behavior
  466.     slightly if stdout is a terminal.  To make the determination,
  467.     these implementations perform an operation which fails (with
  468.     ENOTTY) if stdout is not a terminal.  Although the output
  469.     operation goes on to complete successfully, errno still contains
  470.     ENOTTY.
  471.  
  472.     Reference: CT&P Sec. 5.4 p. 73.
  473.  
  474. 11.3:    My program's prompts and intermediate output don't always show
  475.     up on the screen, especially when I pipe the output through
  476.     another program.
  477.  
  478. A:    It is best to use an explicit fflush(stdout) whenever output
  479.     should definitely be visible.  Several mechanisms attempt to
  480.     perform the fflush for you, at the "right time," but they tend
  481.     to apply only when stdout is a terminal.  (See question 11.2.)
  482.  
  483. 11.4:    When I read from the keyboard with scanf, it seems to hang until
  484.     I type one extra line of input.
  485.  
  486. A:    scanf was designed for free-format input, which is seldom what
  487.     you want when reading from the keyboard.  In particular, "\n" in
  488.     a format string does _not_ mean to expect a newline, but rather
  489.     to read and discard characters as long as each is a whitespace
  490.     character.
  491.  
  492.     It is usually better to use fgets to read a whole line, and
  493.     then use sscanf or other string functions to pick apart the line
  494.     buffer.  If you do use sscanf, don't forget to check the return
  495.     value to make sure that the expected number of items were found.
  496.  
  497. 11.5:    How can I flush pending input so that a user's typeahead isn't
  498.     read at the next prompt?  Will fflush(stdin) work?
  499.  
  500. A:    fflush is defined only for output streams.  Since its definition
  501.     of "flush" is to complete the writing of buffered characters
  502.     (not to discard them), discarding unread input would not be an
  503.     analogous meaning for fflush on input streams.  There is no
  504.     standard way to discard unread characters from a stdio input
  505.     buffer, nor would such a way be sufficient; unread characters
  506.     can also accumulate in other, OS-level input buffers.
  507.  
  508. 11.6:    Once I've used freopen, how can I get the original stdout (or
  509.     stdin) back?
  510.  
  511. A:    If you need to switch back and forth, the best all-around
  512.     solution is not to use freopen in the first place.  Try using
  513.     your own explicit output (or input) stream variable, which you
  514.     can reassign at will, while leaving the original stdout (or
  515.     stdin) undisturbed.
  516.  
  517. 11.7:    How can I recover the file name given an open file descriptor?
  518.  
  519. A:    This problem is, in general, insoluble.  Under Unix, for
  520.     instance, a scan of the entire disk, (perhaps requiring special
  521.     permissions) would theoretically be required, and would fail if
  522.     the file descriptor was a pipe or referred to a deleted file
  523.     (and could give a misleading answer for a file with multiple
  524.     links).  It is best to remember the names of files yourself when
  525.     you open them (perhaps with a wrapper function around fopen).
  526.  
  527.  
  528. Section 12. Library Subroutines
  529.  
  530. 12.1:    I'm trying to sort an array of strings with qsort, using strcmp
  531.     as the comparison function, but it's not working.
  532.  
  533. A:    By "array of strings" you probably mean "array of pointers to
  534.     char."  The arguments to qsort's comparison function are
  535.     pointers to the objects being sorted, in this case, pointers to
  536.     pointers to char.  (strcmp, of course, accepts simple pointers
  537.     to char.)
  538.  
  539.     The comparison routine's arguments are expressed as "generic
  540.     pointers," void * or char *.  They must be converted back to
  541.     what they "really are" (char **) and dereferenced, yielding
  542.     char *'s which can be usefully compared.  Write a comparison
  543.     function like this:
  544.  
  545.         int pstrcmp(p1, p2)    /* compare strings through pointers */
  546.         char *p1, *p2;        /* void * for ANSI C */
  547.         {
  548.             return strcmp(*(char **)p1, *(char **)p2);
  549.         }
  550.  
  551. 12.2:    Now I'm trying to sort an array of structures with qsort.  My
  552.     comparison routine takes pointers to structures, but the
  553.     compiler complains that the function is of the wrong type for
  554.     qsort.  How can I cast the function pointer to shut off the
  555.     warning?
  556.  
  557. A:    The conversions must be in the comparison function, which must
  558.     be declared as accepting "generic pointers" (void * or char *)
  559.     as discussed above.
  560.  
  561. 12.3:    How can I convert numbers to strings (the opposite of atoi)?  Is
  562.     there an itoa function?
  563.  
  564. A:    Just use sprintf.  (You'll have to allocate space for the result
  565.     somewhere anyway; see questions 3.1 and 3.2.  Don't worry that
  566.     sprintf may be overkill, potentially wasting run time or code
  567.     space; it works well in practice.)
  568.  
  569.     References: K&R I Sec. 3.6 p. 60; K&R II Sec. 3.6 p. 64.
  570.  
  571. 12.4:    How can I get the time of day in a C program?
  572.  
  573. A:    Just use the time, ctime, and/or localtime functions.  (These
  574.     routines have been around for years, and are in the ANSI
  575.     standard.)  Here is a simple example:
  576.  
  577.         #include <stdio.h>
  578.         #include <time.h>
  579.  
  580.         main()
  581.         {
  582.             time_t now;
  583.             time(&now);
  584.             printf("It's %.24s.\n", ctime(&now));
  585.             exit(0);
  586.         }
  587.  
  588.     References: ANSI Sec. 4.12 .
  589.  
  590. 12.5:    I know that the library routine localtime will convert a time_t
  591.     into a broken-down struct tm, and that ctime will convert a
  592.     time_t to a printable string.  How can I perform the inverse
  593.     operations of converting a struct tm or a string into a time_t?
  594.  
  595. A:    ANSI C specifies a library routine, mktime, which converts a
  596.     struct tm to a time_t.  Several public-domain versions of this
  597.     routine are available in case your compiler does not support it
  598.     yet.
  599.  
  600.     Converting a string to a time_t is harder, because of the wide
  601.     variety of date and time formats which should be parsed.
  602.     Public-domain routines have been written for performing this
  603.     function (see, for example, the file partime.c, widely
  604.     distributed with the RCS package), but they are less likely to
  605.     become standardized.
  606.  
  607.     References: K&R II Sec. B10 p. 256; H&S Sec. 20.4 p. 361; ANSI
  608.     Sec. 4.12.2.3 .
  609.  
  610. 12.6:    I need a random number generator.
  611.  
  612. A:    The standard C library has one: rand().  The implementation on
  613.     your system may not be perfect, but writing a better one isn't
  614.     necessarily easy, either.
  615.  
  616.     References: ANSI Sec. 4.10.2.1 p. 154; Knuth Vol. 2 Chap. 3
  617.     pp. 1-177.
  618.  
  619. 12.7:    Each time I run my program, I get the same sequence of numbers
  620.     back from rand().
  621.  
  622. A:    You can call srand() to seed the pseudo-random number generator
  623.     with a more random initial value.  Popular random initial seeds
  624.     are the time of day, or the elapsed time before the user presses
  625.     a key.
  626.  
  627.     References: ANSI Sec. 4.10.2.2 p. 154.
  628.  
  629. 12.8:    I need a random true/false value, so I'm taking rand() % 2, but
  630.     it's just alternating 0, 1, 0, 1, 0...
  631.  
  632. A:    Poor pseudorandom number generators (such as the ones
  633.     unfortunately supplied with some systems) are not very random in
  634.     the low-order bits.  Try using the higher-order bits.
  635.  
  636. 12.9-13: I'm trying to port this old    A:  These routines are variously
  637.     program.  Why do I get            obsolete; you should
  638.     "undefined external" errors        instead:
  639.     for:
  640.  
  641. 12.9:    index?                A:  use strchr.
  642. 12.10:    rindex?                A:  use strrchr.
  643. 12.11:    bcopy?                A:  use memmove, after
  644.                         interchanging the first and
  645.                         second arguments (see also
  646.                         question 5.10).
  647. 12.12:    bcmp?                A:  use memcmp.
  648. 12.13:    bzero?                A:  use memset, with a second
  649.                         argument of 0.
  650.  
  651. 12.14:    How can I execute a command with system() and read its output
  652.     into a program?
  653.  
  654. A:    Unix and some other systems provide a popen() routine, which
  655.     sets up a stdio stream on a pipe connected to the process
  656.     running a command, so that the output can be read (or the input
  657.     supplied).
  658.  
  659. 12.15:    How can I read a directory in a C program?
  660.  
  661. A:    See if you can use the opendir() and readdir() routines, which
  662.     are available on most Unix systems.  Implementations also exist
  663.     for MS-DOS, VMS, and other systems.  (MS-DOS also has FINDFIRST
  664.     and FINDNEXT routines which do essentially the same thing.)
  665.  
  666.  
  667.